package com.lazi.june.gateway;

import com.lazi.june.gateway.config.GatewayProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

/**
 * June Gateway 网关应用启动类
 * <p>
 * 这是 June Gateway 微服务网关的主入口，基于 Spring Cloud Gateway 构建。
 * 提供了统一的 API 网关功能，包括：
 * <p>
 * 核心功能：
 * 1. JWT 身份认证：验证请求中的 JWT Token，支持 HMAC 和 RSA 算法
 * 2. 内部路径保护：通过 X-Internal-Secret 保护内部接口，防止外部直接访问
 * 3. 请求限流：基于令牌桶算法的客户端级别限流，防止恶意请求
 * 4. 请求体缓存：支持请求体多次读取，便于日志记录和签名验证
 * 5. 请求日志记录：记录每个请求的详细信息，支持链路追踪
 * 6. 全局异常处理：统一的错误响应格式，便于前端处理
 * <p>
 * 过滤器执行顺序：
 * 1. JwtAuthFilter (-100): 认证过滤器，验证 JWT 或内部密钥
 * 2. RequestBodyCacheFilter (-90): 缓存请求体，支持多次读取
 * 3. RateLimitFilter (-88): 限流过滤器，防止恶意请求
 * 4. RequestLoggingFilter (-80): 日志过滤器，记录请求信息
 * <p>
 * 配置示例 (application.yml)：
 * <pre>
 * june:
 *   gateway:
 *     # JWT 配置
 *     jwt-public-key: ${JWT_PUBLIC_KEY}
 *     jwt-algorithms:
 *       - RS256
 *       - HS256
 *
 *     # 路径访问控制
 *     whitelist:
 *       - /actuator/**
 *       - /public/**
 *     internal-paths:
 *       - /internal/**
 *     internal-secret: ${INTERNAL_SECRET}
 *
 *     # 功能开关
 *     log-enabled: true
 *     cache-request-body: true
 *     rate-limit-per-second: 50.0
 * </pre>
 * <p>
 * 部署说明：
 * - 建议通过环境变量注入敏感配置（如 JWT 公钥、内部密钥）
 * - 可以通过 Spring Cloud Config 或 Kubernetes ConfigMap 管理配置
 * - 支持水平扩展，多实例部署时限流按实例独立计算
 * <p>
 * 技术栈：
 * - Spring Boot 3.x
 * - Spring Cloud Gateway
 * - Project Reactor (WebFlux)
 * - Nimbus JOSE + JWT (JWT 验证)
 * - Lombok (代码简化)
 *
 * @author huliqian
 * @since 2025/8/21
 */
@SpringBootApplication
@EnableConfigurationProperties({GatewayProperties.class})
public class GatewayApplication {
    /**
     * 应用程序主入口
     * <p>
     * 启动 Spring Boot 应用，初始化所有网关组件：
     * - 加载配置（GatewayProperties）
     * - 注册过滤器（JwtAuthFilter、RateLimitFilter 等）
     * - 初始化错误处理器（GlobalErrorHandler）
     * - 启动 Netty 服务器（默认端口 8080）
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}
